package com.docparser.processor;

import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * 处理数学函数元素。
 */
public class FunctionProcessor extends BaseProcessor {
    
    /**
     * 处理函数元素。
     */
    public static void process(Element funcElement, StringBuilder formula, ProcessorCallback callback) {
        if (funcElement == null) return;
        
        String functionName = getFunctionName(funcElement, callback);
        String argument = getFunctionArgument(funcElement, callback);
        
        if (functionName != null) {
            // 处理特殊函数名称和参数
            appendFunction(formula, functionName, argument);
        }
    }

    /**
     * 获取函数名称。
     */
    private static String getFunctionName(Element funcElement, ProcessorCallback callback) {
        StringBuilder name = new StringBuilder();
        NodeList children = funcElement.getElementsByTagNameNS(
            MATH_NAMESPACE, "fName");
        if (children.getLength() > 0) {
            callback.processElement((Element) children.item(0), name);
            return name.toString().trim();
        }
        return null;
    }

    /**
     * 获取函数参数。
     */
    private static String getFunctionArgument(Element funcElement, ProcessorCallback callback) {
        StringBuilder arg = new StringBuilder();
        NodeList children = funcElement.getElementsByTagNameNS(
            MATH_NAMESPACE, "e");
        if (children.getLength() > 0) {
            callback.processElement((Element) children.item(0), arg);
            return arg.toString().trim();
        }
        return "";
    }

    /**
     * 添加函数到LaTeX公式。
     */
    private static void appendFunction(StringBuilder formula, String name, String argument) {
        if (isTrigFunction(name)) {
            formula.append(getLatexFunction(name));
        } else {
            formula.append("\\").append(name);
        }
        formula.append("{").append(argument).append("}");
    }

    /**
     * 检查是否是三角函数。
     */
    private static boolean isTrigFunction(String name) {
        return name.equals("sin") || name.equals("cos") || name.equals("tan") ||
               name.equals("csc") || name.equals("sec") || name.equals("cot") ||
               name.equals("arcsin") || name.equals("arccos") || name.equals("arctan");
    }

    /**
     * 获取LaTeX三角函数表示。
     */
    private static String getLatexFunction(String name) {
        if (name.startsWith("arc")) {
            return "\\" + name.substring(3) + "^{-1}";
        }
        return "\\" + name;
    }
}
